package com.zhl;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    //提供容器存放账户信息  账户不能被随便访问，要私有
    private ArrayList<Account> acounts = new ArrayList<Account>();
    Scanner sc = new Scanner(System.in);
    private Account loginAccount; //记录登录账户对象
    //启动ATM系统,展示欢迎界面
    public void start(){
        while (true) {
            System.out.println("===欢迎使用ATM系统===");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择操作：");
            String command = sc.next();
            switch(command){
                case "1":
                    //用户登录
                    login();
                    break;
                case "2":
                    //用户开户
                    createAccount();
                    break;
                default:
                    System.out.println("输入错误，请重新输入！");
                    break;
            }
        }

    }

    //设计用户登录操作
    private void login(){
        System.out.println("===用户登录操作===");
        //1.判断是否有用户
        if(acounts.size() == 0){
            System.out.println("当前系统没有用户，请先登陆后再来开户！");
            return;
        }

        //2.输入卡号和密码进行验证
        Account exits = null;
        while (true) {
            System.out.println("请输入您的卡号:");
            String cardId = sc.next();
            //判断卡号是否存在
            exits = findAccountByCardId(cardId);
            if(exits == null){
                System.out.println("卡号不存在，请重新输入！");
                continue;
            }
            break;
        }
            //3.输入密码进行验证
        while (true) {
            System.out.println("请输入您的密码:");
            String passsword = sc.next();
            if(exits.getPassWord().equals(passsword))
            {
                loginAccount = exits;  //记录登录账户对象  便于在其他的方法中进行使用操作
                //登录成功  跳出密码输入循环
                System.out.println("登录成功"+exits.getUserName()+",进入ATM系统！你的卡号是:"+exits.getCardId());
                //进入ATM系统   这里设计一个方法 展示操控菜单  登录后的位置
                showOperationMenu();   //用户退出登录会到达这个位置  在这里需要退出这个方法才能回到欢迎页面
                return;
            }else{
                System.out.println("密码错误，请重新输入！");
            }
        }

    }

    //展示操作页面
    private void showOperationMenu(){
        while (true) {
            System.out.println("==="+loginAccount.getUserName()+"您可以选择如下功能进行账户处理===");
            System.out.println("1.查询账户信息");
            System.out.println("2.取款");
            System.out.println("3.存款");
            System.out.println("4.转账");
            System.out.println("5.修改密码");
            System.out.println("6.退出账户");
            System.out.println("7.注销账户");
            System.out.println("请选择功能操作：");
            String select = sc.next();
            switch (select){
                case "1":
                    //查询当前账户
                    showUserInfo();
                    break;
                case "2":
                    getMoney();
                    //取款操作
                    break;
                case "3":
                    //存款操作
                    saveMoney();
                    break;
                case "4":
                    //转账操作
                    transferMoney();
                    break;
                case "5":
                    //修改密码操作
                    updatePassword();
                    return; //退出登录  即退出该方法  将会回到登录位置。
                case "6":
                    //退出账户操作
                    System.out.println(loginAccount.getUserName()+"您成功退出账户！！！");
                    return; //退出登录  即退出该方法  将会回到登录位置。
                case "7":
                    //注销账户操作  失败 返回当前，成功返回欢迎页面。
                    if(deleteAccount()){
                        //删除账户成功  回到欢迎页面
                        return;
                    }
                    break;
                default:
                    System.out.println("输入错误，请重新输入！");
                    break;
            }
        }
    }

    private void updatePassword() {
        System.out.println("===修改密码操作===");
        //1.输入旧密码
        while (true) {
            System.out.println("请输入当前账户密码:");
            String oldPassword = sc.next();
            if(loginAccount.getPassWord().equals(oldPassword)){
                while (true) {
                    //密码正确  开始修改密码
                    System.out.println("请输入新的密码:");
                    String newpassword1 = sc.next();
                    System.out.println("请再次确认你要修改的密码:");
                    String newpassword2 = sc.next();
                    if(newpassword1.equals(newpassword2)){
                        //密码一致  开始修改密码
                        loginAccount.setPassWord(newpassword1);
                        //修改密码成功  跳出密码输入循环   直接退出方法  回到欢迎页  因为密码修改成功，需要重新登录。
                        System.out.println("密码修改成功，请重新登录！");
                        return;
                    }else{
                        System.out.println("两次密码不一致，请重新输入！");
                    }
                }
            }else{
                System.out.println("密码错误，请重新输入！");
            }
        }

    }

    //注销账户操作
    private boolean deleteAccount() {
        while (true) {
            System.out.println("===注销账户操作===");
            //1.询问用户是否确认注销账户
            System.out.println("您确认要注销账户吗？(Y/N)");
            String confirm = sc.next();
            switch (confirm){
                case "Y":
                    //1.判断用户账户是否有钱
                    if(loginAccount.getMoney() > 0){
                        System.out.println("您的账户余额为"+loginAccount.getMoney()+"，请先充值后再注销账户！");
                        return false;
                    }else{
                        //2.删除账户信息
                        acounts.remove(loginAccount);
                        System.out.println("注销账户成功！");
                        return true;
                    }
                case "N":
                    System.out.println("您取消了注销账户操作！");
                    return false;
                default:
                    System.out.println("输入错误，请重新输入！");
                    //进入循环重新输入
            }
        }

    }

    //4.转账操作
    private void transferMoney() {
        System.out.println("===用户转账操作===");
        //首先判断是否有其他账户，否则不给转
        if(acounts.size() < 2){
            System.out.println("当前系统只有你一个账户，没有其他账户，无法转账！");
            return;
        }
        //判断账户是否有钱
        if(loginAccount.getMoney() == 0){
            System.out.println("您的账户余额为0，无法转账！");
            return;
        }
        while (true) {
            //真正开始转账
            System.out.println("请输入您要转账的账户卡号:");
            //接收输入的卡号
            String cardId = sc.next();
            //判断账户是否存在  还要接收这个用户
            Account acc = findAccountByCardId(cardId);

            if(acc == null){
                System.out.println("卡号不存在，请重新输入！");
            }else if(cardId.equals(loginAccount.getCardId())){
                System.out.println("不能转账给自己！");
            }else{
                //账户存在  且不是自己  则可以转账
                //判断对方姓氏  并给予提示
                //对转账账户的姓名进行隐藏
                String name = "*"+acc.getUserName().substring(1);
                System.out.println("请您输入【"+name+"】的姓氏:");
                String name1 = sc.next();
                //判断姓氏是否正确
                if(acc.getUserName().startsWith(name1)){
                    while (true) {
                        //姓氏正确  开始转账
                        System.out.println("请输入您要转账的金额:");
                        double money = sc.nextDouble();
                        //判断转账金额是否大于余额
                        if(money < loginAccount.getMoney()){
                            //余额充足  开始转账  转账结束后，要跳出循环
                            loginAccount.setMoney(loginAccount.getMoney() - money);
                            acc.setMoney(acc.getMoney() + money);
                            System.out.println("转账成功，转账金额为:"+money+"您的余额为："+loginAccount.getMoney());
                            return;  //因为转账结束了，循环有点多，所以直接返回，跳出方法，不用再循环了 ,回到用户操作页
                        }else{
                            //余额不足  无法转账  给个循环，重新输入转账金额！
                            System.out.println("您的账户余额为"+loginAccount.getMoney()+"。转账金额大于余额，无法转账！");
                        }
                    }

                }else{
                    System.out.println("姓氏输入错误，请重新输入！");
                }
            }
        }

    }

    //菜单方法 1.展示用户信息
    private void showUserInfo(){
        System.out.println("===查询账户信息===");
        System.out.println("您的账户信息如下：");
        System.out.println("用户名："+loginAccount.getUserName());
        System.out.println("性别："+loginAccount.getSex());
        System.out.println("卡号："+loginAccount.getCardId());
        System.out.println("存款金额："+loginAccount.getMoney());
        System.out.println("取现额度："+loginAccount.getLimit());
    }

    // 2.取款操作
    private void getMoney(){
         System.out.println("===取款操作===");
         //首先判断用户是否有100以上金额，否则不给取
         if(loginAccount.getMoney() < 100){
             System.out.println("您的账户余额不足100元，无法取款！");
             return;
         }
        while (true) {
            System.out.println("请输入您要取出的金额:");
            double money = sc.nextDouble();
            //判断用户输入的金额是否大于余额
            System.out.println();
            if(money > loginAccount.getMoney())
            {
                System.out.println("您的账户余额不足，无法取款！您的余额为:"+loginAccount.getMoney());
            }else{
                //判断用户输入的金额是否大于限制额度
                if(money > loginAccount.getLimit()){
                    System.out.println("您的取现额度为:"+loginAccount.getLimit()+",超过金额，无法取款！");
                }else{
                    //可以取款
                    loginAccount.setMoney(loginAccount.getMoney() - money);
                    System.out.println("取款成功，取款金额为:"+money+"您的余额为："+loginAccount.getMoney());
                    break;
                }
            }
        }
    }

    // 3.存款操作
    private void saveMoney(){
        System.out.println("===存款操作===");
        System.out.println("请输入您要存入的金额:");
        double moneys = sc.nextDouble();
        //计算存款后的金额
        double save = loginAccount.getMoney() + moneys;
        //存入
        loginAccount.setMoney(save);
        System.out.println("存款"+moneys+"成功，您的账户余额为："+loginAccount.getMoney());
    }

    //用户开户  私有哦
    private void createAccount() {
        //1.创建一个账户对象，用于封装用户信息
        Account ac = new Account();
        System.out.println("===系统开户操作===");
        //2.需要用户输入自己的开户信息
        System.out.println("请输入您的账户名称：");
        String name = sc.next();
        ac.setUserName(name);

        while (true) {
            //3.把开户信息存入到账户集合中去
            System.out.println("请输入您的性别:");
            char sex = sc.next().charAt(0);   //获取输入的第一个字符
            if(sex == '男' || sex == '女'){
                ac.setSex(sex);
                break;
            }else{
                System.out.println("性别输入错误~(只能是男或女)请重新输入！");
            }
        }
        //对于密码要进行两次确认
        while (true) {
            System.out.println("请输入您的密码:");
            String password1 = sc.next();
            System.out.println("请输入您的密码进行再次确认:");
            String password2 = sc.next();
            if(password1.equals(password2)){
                ac.setPassWord(password1);
                break;
            }else{
                System.out.println("两次密码输入不一致，请重新输入！");
            }
        }

        System.out.println("请输入您的取现额度:");
        double limit = sc.nextDouble();
        ac.setLimit(limit);

        //系统自动生成用户卡号,卡号由八位数字组成，不能与其他账户的卡号重复
        String cardId = generateCardId();
        ac.setCardId(cardId);


        //4.把账户信息存入到账户集合中
        acounts.add(ac);
        System.out.println("恭喜您,"+ac.getUserName()+",开户成功！您的账户卡号为：" + ac.getCardId());
    }

    //设计一个新方法  用于产生八位数字的卡号，且不能和其他卡号重复
    private String generateCardId(){
        String cardId = null;
        while (true) {
            //定义一个String类型的变量，作为存放卡号
            cardId = "";
            //使用循环，循环8次,每次产生一个随机数字，并拼接到卡号变量中
            Random r = new Random();
            for(int i=0;i<8;i++){
                int num = r.nextInt(10);
                cardId += num;
            }
            //判断是否与其他卡号重复,没有重复才可以作为一个新卡号返回
            Account ac = findAccountByCardId(cardId);
            if(ac == null){
                return cardId;
            }
            //如果卡号重复，则重新生成卡号 继续循环执行，只有生成新的不重复的才可以通过return返回
        }
        }
        //设计一个方法 ， 根据卡号查询账户信息 返回  accounts = {c1,c2,c3....}
            //若是没有找到，返回null 找到了，返回Account对象
        private Account findAccountByCardId(String cardId){
            //遍历全部的账户对象，找到卡号匹配的账户对象
            for(int i =0;i<acounts.size();i++){
                Account ac = acounts.get(i);
                if (ac.getCardId().equals(cardId)){
                    return ac;
                }
            }
            return null;
        }
}
